package com.hu.system.mapper;

import java.util.List;

import com.hu.system.domain.StockInbound;
import org.apache.ibatis.annotations.Param;

/**
 * 库存入库Mapper接口
 *
 * @author hu
 * @date 2025-01-21
 */
public interface StockInboundMapper {
    /**
     * 新增库存入库
     *
     * @param stockInbound 库存入库
     * @return 结果
     */
    public int insertStockInbound(StockInbound stockInbound);

    /**
     * 根据来源ID删除库存入库记录（软删除）
     *
     * @param sourceId 来源ID（如采购记录ID）
     * @return 结果
     */
    public int deleteStockInboundBySourceId(Long sourceId);

    /**
     * 根据来源ID批量删除库存入库记录（软删除）- 采购类型
     *
     * @param sourceIds 来源ID数组
     * @return 结果
     */
    public int deleteStockInboundBySourceIds(Long[] sourceIds);

    /**
     * 根据退货来源ID批量删除库存入库记录（软删除）- 退货类型
     *
     * @param sourceIds 退货记录ID数组
     * @return 结果
     */
    public int deleteStockInboundByReturnSourceIds(Long[] sourceIds);

    /**
     * 查询库存入库列表
     *
     * @param stockInbound 库存入库
     * @return 库存入库集合
     */
    public List<StockInbound> selectStockInboundList(StockInbound stockInbound);

    /**
     * 根据SKU列表批量软删除库存入库记录
     *
     * @param skus SKU列表
     * @return 结果
     */
    public int deleteStockInboundBySkus(List<String> skus);

    /**
     * 批量新增库存入库
     *
     * @param stockInboundList 库存入库列表
     * @return 结果
     */
    public int batchInsertStockInbound(List<StockInbound> stockInboundList);

    /**
     * 根据来源ID和类型更新库存入库记录
     *
     * @param stockInbound 库存入库对象（包含sourceId、inboundType等更新字段）
     * @return 结果
     */
    public int updateStockInboundBySourceId(StockInbound stockInbound);

    /**
     * 查询所有 source_id 为空的库存入库记录（孤立记录）
     *
     * @param inboundType 入库类型（PURCHASE/RETURN）
     * @return 孤立的库存入库记录列表
     */
    public List<StockInbound> selectOrphanStockInbound(String inboundType);

    /**
     * 根据原始数据精确匹配孤立的库存记录
     * 在 SQL 层面直接过滤，避免内存遍历所有孤立记录
     *
     * @param inboundType 入库类型（PURCHASE/RETURN）
     * @param sku SKU编码
     * @param quantity 入库数量
     * @param inboundDate 入库日期
     * @param createBy 创建人（可选）
     * @return 匹配的孤立库存记录（最多返回1条）
     */
    public StockInbound selectOrphanStockInboundByOriginalData(
        @Param("inboundType") String inboundType,
        @Param("sku") String sku,
        @Param("quantity") Integer quantity,
        @Param("inboundDate") java.util.Date inboundDate,
        @Param("createBy") String createBy
    );

    /**
     * 更新单条库存入库记录
     *
     * @param stockInbound 库存入库对象
     * @return 结果
     */
    public int updateStockInbound(StockInbound stockInbound);
}

